 -=( 7A69#12 )=--=( art5 )=--=( Seguridad; Vision general. )=--=( Anonimo )=-


------[	Introduccion

En este mundo de hoy en dia de redes internacionales y comercio electronico, 
muchos sistemas informaticos son un potencial objetivo. No es raro que cada 
mes salga en las noticias que un sistema informatico de una organizacion 
importante ha sido penetrado por intrusos (No voy a llamarles hackers porque 
no es mi intencion manchar el nombre de "hacker"). En estos ultimos aos han 
ocurrido grandes catastrofes, informaticamente hablando, como por ejemplo: 
ordenadores que se han quedado inoperativos, los ficheros han sido 
sospechosamente alterados, el software ha sido cambiado por secretas 
"backdoors" en su lugar, informacion privada ha sido copiada sin autorizacion 
y millones de passwords han sido capturadas, entre otras muchas cosas.

Muchos administradores despues de estos "ataques" pasan muchas horas o dias, 
reseteando y configurando el sistema comprometido para una seguridad mejor en 
el sistema. Los motivos que llevan a un intruso a penetrar en el sistema son 
que solo entran para "darse una vuelta" y normalmente no leen informacion
confidencial ni borran ningun archivo. Aunque mucha gente diferente rompe la 
seguridad de los sistemas por ejemplo para hacerse publicidad modificando la 
web.

Los terminos: seguridad, proteccion y privacidad para muchos profesionales 
que trabajan en este "tema" no conocen muy bien estos terminos. El objetivo 
de este texto no es ser una guia para seguridad informatica, no pretendo esto,
solo dar unas "nociones" de seguridad en UNIX.


------[	Que es un Sistema Operativo?

Para mucha gente un ordenador es una utilidad que sirve para solucionar 
problemas. Cuando ejecutamos un procesador de textos el ordenador es una 
maquina para poner palabras e ideas. Cuando usamos una hoja de calculos, el 
ordenador es una maquina financiera, como una poderosa calculadora. 
Conectandonos a una red, el ordenador forma parte de un potente sistema de 
comunicacion.

Todos los ordenadores estan manejados por programas llamados sistemas 
operativos. El sistema operativo forma parte de un mecanismo y politica para 
ayudar a definir el control de los recursos del sistema.

A lo largo del sistema operativo, funciona con utilidades estandars para 
mejorar las funciones de copiar ficheros y listar los contenidos de los 
directorios. Normalmente estos pogramas no forman parte de el sistema 
operativo y esto suele producir un impacto a la seguridad del sistema.

Todos los sistemas UNIX se pueden dividir en tres partes:

  - El kernel. Es el corazon del sistema UNIX, es el sistema operativo. 
    El kernel es un programa especial que se carga dentro del ordenador cuando
    esta se inicia. El kernel controla todoas las llamadas del sistema, hace 
    que corran programas al mismo tiempo, etc. El kernel incluye el sistema de
    ficheros que controla que ficheros y directorios van ha estar en el disco 
    duro del ordenador. El sistema de ficheros es el mecanismo con el que la 
    seguridad del ordenador es forzada. Algunas versiones modernas de UNIX 
    rechazan programas instalados por el usuario para cargar modulos 
    adicionales dentro del kernel antes de que el sistema carge.

  - Programas de utilidades standard son cargadas por los usuarios y por el 
    sistema. Algunos programas son pequellos y con una unica funcion, como por
    ejemplo /bin/ls que lista ficheros, /bin/cp los copia. Otros programas son
    mas grandes y tienen incluidas mas funciones, por ejemplo /bin/sh y 
    /bin/csh, son shells UNIX que procesan los comandos del usuario.

  - Base de datos del sistema. Muchas de estas son relativamente pequeas y 
    son usadas por variados programas en el sistema. Un fichero /etc/passwd 
    contiene la lista de todos los usuarios del sistema. Otro fichero 
    /etc/group describe los grupos de usuarios con similar acceso.

Desde el punto de vista de la seguridad en UNIX, estas tres partes interactuan
con cuatro procesos:

  - Politica de seguridad, que determina que ordenador corre con respecto al 
    usuario y al administrador. La politica de seguridad juega un papel 
    importante para determinar tu seguridad del ordenador en el sistema 
    operativo. Un ordenador se supone que estara seguro si se usa las mayores 
    sofisticaciones en cuanto a seguridad, pero es falso. Por esta razon, 
    la politica a establecer es encriptar, esto juega un papel muy importante 
    dentro del proceso de la seguridad del sistema.

   Tipos de Sistemas UNIX:
   -----------------------

Podemos encontrar estos UNIX en el mundo:

  - NextStep (Derivado del BSD 4.3), FreeBSD, BSD/OS, SunOS, Linux, DEC OSF/1,
    AIX, HP-UX, Solaris, IRIX, SCO UNIX.


------[	Seguridad y UNIX

Dennis Ritchie escribio sobre la seguridad de UNIX: "No ha sido diseado para 
empezar a ser seguro. Ha sido diseado para las caracteristicas necesarias
para hacer un servicio seguro".

UNIX es un sistema multi-usuario y multi-tarea. Multi-usuario significa que el
sistema operativo permite mucha gente diferente para usar el mismo ordenador 
al mismo tiempo. Multi-tarea significa que el usuario puede ejecutar varios 
programas a la vez.

Una de las funciones naturales de un sistema operativo es prevenir que gente 
diferente (o programas) usen otros programas que puedan interferir a otros. 
Para solucionar este problema, en muchos lugares optan por usar la filosofia 
UNIX.

Pero la seguridad de UNIX proviene de la proteccion de memoria. UNIX tiene un 
sistema de seguridad muy sofisticado que controla los accesos de los usuarios 
a los ficheros, modificaciones en las bases de datos del sistema y los
recursos del sistema. Desafortunadamente, estos mecanismos de seguridad no 
ayudan mucho cuando el sistema es microconfigurado o tiene un bug en el 
software.


------[	Planeando nuestras necesidades de seguridad

Un ordenador es seguro si cumple nuestras espectaciones.

Hay muchos tipos de seguridad en los ordenadores y muchas definiciones. 
Podemos creer que la seguridad de los ordenadores puede ser por ejemplo: Este 
ordenador no puede ser usado porque no esta en red, pero esta no es la razon, 
no es todavia seguro (internamente hablando).

Los pasos claros de la para que un ordenador sea mas seguro son estos:

  - Confidencialidad: Proteger la informacion para que no pueda ser leida o 
    copiado por alguien que no tenga acceso a esta informacion.

  - Integracion de datos: Proteger la informacion (incluido programas) que 
    puedan ser borrados o alterados. La informacion debe de ser protegida con 
    cintas de backups, creacion de ficheros auxiliares y documentacion.

  - Abilitar: Proteger nuestros servicios para que no puedan ser degradados y 
    deshabilitados (Con un DoS por ejemplo) sin autorizacion. Con esto 
    podremos evitar que la informacion del sistema que reside en nuestro 
    ordenador sea borrada.

  - Consistencia: Hacer seguro el sistema ante los usuarios sin autorizacion. 
    Si el software o el hardware empiezan a dar problemas, buscar las 
    actualizaciones de esos bugs.

  - Control: Regular el acceso a nuestro sistema. Si desconocemos si unos 
    individuos han entrado en nuestro sistema, tenemos un grave problema. 

  - Auditar: Esta bien que nos preocupemos si han entrado usuarios sin 
    autorizacion, todos cometemos errores. En estos casos, necesitamos 
    determinar: cuando ha pasado, como ha pasado y que ha sido afectado y a 
    partir de ahi, solucionarlo.


------[ Usuarios y passwords

En esta seccion explico el sistema de usuarios y de password en UNIX. Veremos 
como hacer una buena password.

Una buena password es la primera linea de defensa hacia un ataque. La gente 
sin autorizacion, prueba passwords para tener un acceso a nuestro sistema. Los
intrusos prueban passwords posibles desde una base de datos (comunmente un 
diccionario de passwords) y si consiguen nuestro fichero de passwords prueban 
a sacar las claves encriptadas que este fichero contiene con programas que 
existen para ello (comunmente llamado crackear las claves).

Cuando el atacante tiene acceso, es libre de darse una vuelta, mirar otros 
fallos de seguridad para explotar para tener mayores privilegios. La mejor 
manera de proteger nuestro sistema es vigilar accesos de usuarios sin 
autorizacion. Para solucionar todo esto, tendremos que crear buenas passwords 
para que sea mas dificil sacarlas con un crackeador. Pero muchas veces, 
buenas passwords no son suficiente. Muchas veces estas passwords pasan por 
sniffers (programas que monitorizan la red en busca de paquetes).

Todas las personas que usan UNIX tienen una cuenta. Una cuenta se identifica 
por un nombre de usuario. Tradicionalmente, esta cuenta tiene una password 
secreta asocidad para prevenir accesos sin autorizacion.

   Passwords
   ---------

Cuando entramos en nuestra cuenta, normalmente nos sale un promt pidiendo 
nuestro usuario y password.

   El fichero etc/passwd
   ---------------------

UNIX usa el etc/passwd para guardar las passwords de todos los usuarios del
sistema. El etc/passwod contiene el nombre de usuario, el nombre real, 
informacion e informacion de la cuenta del usuario. Para ver nuestro 
/etc/passwd con un simple "cat" podremos verlo. Aqui os pongo un ejemplo de la 
extructura del passwd:

	root:fi3sED95ibqR6:0:1:System
	Operator:/:/bin/ksh 
	daemon:*:1:1::/tmp:
	ucp:OORoMN9FyZfNE:4:4::/var/spool/uucppublic:/usr/lib/uucp/uucico 
	what:eH5/.mj7NB3dx:181:100:What is DTF:/u/what:/bin/ksh 
	where:f8fk3j1OIf34.:182:100:How me:/u/how:/bin/csh

Aqui vemos tres cuentas: root, daemond y uucp y cuentas del sistema what y 
where que son cuentas de usuarios individuales.

La linea what:eH5/.mj7NB3dx:181:100:What is DTF:/u/what:/bin/ksh cada apartado
tiene un significado, es este:

	Partes		Contenido
	------		---------

	what		El nombre de usuario
	eH5/.mj7NB3dx	El password encriptado
	181		El numero de identificacion del usuario (UID)
	100		El numero de identificacion de grupo (GID)
	What is	DTF	El nombre completo
	/u/what		El directorio home del usuario
	/bin/ksh/	La shell del usuario

Hoy en dia la mayoria de los sistemas UNIX usan el sistema shadowing 
/etc/shadow en donde se muestra el password encriptado a simple vista.


------[ Usuarios, grupos y el superusuario
 
Normalmente todos los usuarios de UNIX tienen un nombre de usuario con mas de 
ocho caracteres de longitud, dentro del ordenador UNIX se representa a este 
usuario por un numero, llamado UID. Normalmente, los administradores de 
sistemas UNIX, ponen a lo usuarios con diferente UID.

UNIX usa nombres de usuarios especiales por la variedad de las funciones del 
sistema en cuestion. Estos nombres de usuario van asociados a usuarios 
humanos, los nombres de usuario del sistema normalmente tienen sus UIDS 
iguales. Estos son los usuarios comunes en UNIX:

  - root, el superusuario, este usuario controla las funciones del sistema a 
    bajo nivel.

  - daemond (demonio) o sys, estos son algunos de los aspectos de la red. Este
    nombre de usuario va asociado a utilidades del sistema, por ejemplo ircd, 
    httpd, ftpd (La d significa daemond).

  - agente, este "apodo" es el que controla los aspectos de el e-mail. En 
    muchos sistemas el agente tiene el mismo UID que los daemond.

  - guest, es el usuario invitado al sistema.

  - ftp, es el que da acceso anonimo al FTP.

  - uucp, es el que controla el sistema UUCP.

  - news, es el que controla el sistema Usenet (sistema de las news).

  - lp, es el usuado por el sistema para la impresion.

  - nobody, es el usuario que no tiene asociado ningun fichero y normalmente 
    es usado para hacer operaciones sin privilegios.

Aqui os pongo otro ejemplo de etc/passwd con los usuarios y daemond aqui 
comentados:

	root:zPDeHbougaPpA:0:1:Operator:/:/bin/ksh
	nobody:*:60001:60001::/tmp:
	agent:*:1:1::/tmp:
	daemon:*:1:1::/tmp:
	ftp:*:3:3:FTP User:/usr/spool/ftp:
	uucp:*:4:4::/usr/spool/uucppublic:/usr/lib/uucp/uucico
	news:*:6:6::/usr/spool/news:/bin/csh

Como veis, todas las cuentas excepto root tienen el password cerrado (*).


------[ Identificacion del usuario

UID es una asignacion de 16-bits, que van desde el 0 hasta el 65535. UID 
normalmente es del 0 al 9 para las tipicas funciones del sistema. Los UID 
asignados a los usuarios humanos, van de 20 a 100.

	what:eH5/.mj7NB3dx:181:100:What DTF:/u/how:/bin/ksh

En esta cuenta, el UID es el numero 181.

Como nota curiosa, antiguamente los UIDS iban de -32768 a 32767.


------[ Grupos e Identificaciones de Grupos (GID)

Todos los UNIX estan organizados por grupos. Todas las cuentas de usuarios 
estan asignadas por nombres de grupo e identificaciones de grupo, llamadas 
GID). GID al igual que UID tambien es de 16-bits.

        what:eH5/.mj7NB3dx:181:100:What is DTF:/u/how:/bin/ksh

En la cuenta anterior, el GID es el 100.


------[ El fichero /etc/group

El fichero /etc/group contiene una base de datos de todas las listas de 
grupos en nuestro ordenador y su correspondiente GID. El formato es similar 
al usado por el fichero /etc/passwd.

Esto es un ejemplo de un fichero /etc/group, dividido en cinco grupos: wheel, 
uucp, vision, dtf y users.

	wheel:*:0:root,how
	uucp:*:10:uucp
	users:*:100:
	vision:*:101:why,how,dtf
	starwars:*:102:dtf,log,why

Ahora os explico el significado de cada columna:

	Contenido		Descripcion
	---------		-----------
	wheel			El nombre del grupo
	*			El password del grupo (descrito antes)
	0			El GID del grupo
	root,how		El listado de usuarios que hay en ese grupo


------[ Los permisos de directorio

Una de las cosas buenas en UNIX es asignar a cada usuario un tipo de permiso, 
acontinuacion describire los permisos que existen en UNIX:

	r	read	Solo tienes la funcion de poder leer ficheros (read).
	w	write	Puedes crear, renombrar y borrar cualquier fichero.
	x	execute	Puedes ejecutar ese fichero.

Por ejemplo al hacer un "ls -l" nos encontraremos esto:

	-rwxr-xr-x 1 wheel    how       122880 Feb  9 13:26 stats*

Aqui podeis ver los permisos que tiene ese fichero.


------[ Explicacion de SUID

Algunas veces,usuarios sin privilegios necesarios, necesitan hacer tareas que 
los requieren. Por ejemplo el programa "passwd", que como sabeis sirve para 
cambiar el password. Para cambiar una password se requiere modificar el 
fichero /etc/passwd. Pero claro, ese usuario no tiene permio para cambiar ese 
fichero. Tambien, el programa "mail" requiere que inserte el mensaje en la 
"bandeja de entrada" (mailbox) por otro usuario, si no tienes permiso no 
puedes hacerlo.

Para solucionar estos y otros muchos problemas, UNIX permite ejecutar 
programas. Son programas que cambian el UID y se llaman paradojicamente SUID 
(set-	UID). El programa que cambia el GID se llama SGID (set-GID).


------[ SUID, SGID

Cuando hacemos un "ls -l", nos saldra algo parecido a esto:

	-rwsr-sr-t: 

La primera "s" indica que el programa es SUID. 
La segunda "s" indica que el programa es SGID.
La "t" indica que el programa es sticky.


------[ Problemas con SUID

Todos los programas que usan SUID, SGID, puedes producir problemas de 
seguridad muy graves. Por ejemplo un simple usuario, puede ser root 
simplemente corriendo una copia SUID del csh. Muchos administradores no se 
preocupan en ver copias de SUID en su sistema, para solucionar este problema:

	% cp /bin/sh /tmp/break-acct 
	% chmod 4755 /tmp/break-acct

Estos comandos lo que hacen es crear una version SUID del programa "sh".


------[ Chown, cambiando la propiedad de un fichero

El comando "chown" sirve para cambiar el propietario de un fichero. Solo el 
root puede cambiar el propietario. El comando "chown" se usa asi:

	chown [ -fRh ] propietario lista de ficheros

La opcion -f y -R interpretan si son soportado chmod y chgrp (que sirve para 
cambiar los ficheros de un grupo). La opcion -h es un bit de diferencia de 
chmod.

  - Propietario: Aqui se especifica el nuevo propietario.

  - Lista de ficheros: La lista de ficheros del propietario que quieres 
    cambiar.

El comando comentado antes, llamado "chgrp" sirve para cambiar la lista de 
ficheros de un grupo, su sintaxis correcta es asi:

	chgrp [ -fRh ] grupo lista de ficheros

Por ejemplo, para cambiar el grupo how a el otro grupo llamado dtf se haria asi:

	% ls -l paper.tex
	-rw-r--r-- 1 dtf	 how      59321 Jul 12 13:54 paper.tex		
	% chgrp dtf paper.tex 
	% ls -l paper.tex 
	-rw-r--r-- 1 dtf      dtf      59321 Jul 12 13:54 paper.tex

Como veis, hemos cambiado el grupo "how" al grupo "dtf" en el fichero 
paper.tex.


------[ Sistemas de seguridad

En esta parte del texto, quiero hacer una breve lista sobre como combatir un 
poco a los intrusos:

  - Hacer backups de los ficheros mas importantes

  - Defiende tus cuentas.

  - Monotoriza tu red.

  - Audita y logea. Logea todo tu sistema y busca los fallos cada poco tiempo para estar mas protegido.

  - Protege tu sistema de programas extraos. Por ejemplo troyanos, gusanos, etc.

  - Seguridad fisica.

  - Seguridad interna. Investiga los conocimientos que tienen tus empleados y si es necesario crea cursos de seguridad.


------[ Seguridad telefonica

La principal funcion de un modem, es habilitar las comunicaciones (enviar 
correo, leer news y documentos de todo el mundo entre otras cosas). Antes de 
todo, un ordenador no es otra cosa realmente que una "calculadora 
programable". Pero un modem o un interface de red, los ordenadores pueden 
"hablar" entre si y enviarse informacion.

Pero en el mundo de la seguridad informatica, las buenas comunicaciones tienen
doble filo. Las comunicaciones puedes ser atacadas por saboteadores pudiendo 
leer tu informacion facilmente.


------[ Modem. Teoria de operacion

Los modems son aparatos que transmiten informacion atraves de la linea 
telefonica. La palabra modem es un acronimo de modulador-demoludor. El modem 
traduce la informacion en una serie de tonos (modulacion) al final de la 
linea telefonica y traduce los tonos de vuelta en el otro lado del final de 
la linea telefonica (demodular). La mayoria de los modems son 
bidireccionales".


------[ Interfaces de serie

La informacion dentro de todos los ordenadores se mueven en paquetes de 8, 
16 o 32 bits. Cuando esta informacion abandona el ordenador, se divide en 
serie de simples bits que se transmiten secuencialmente. Los interfaces de 
serie transmiten informacion en serie de pulsos. Un pulso especial se le 
llama bit de comienzo (start bit) que significa el comienzo del caracter y 
los del final del caracter se llaman bit de parada (stop bit).


------[ UUCP

UUCP es el sistema de copiado UNIX-to-UNIX. UUCP tiene tres usos:

  - Enviar e-mails y noticias a otros usuarios remotamente.

  - Tranferir ficheros a otros sistemas UNIX.

  - Ejecutar comandos en sistemas remotos.


------[ Seguridad en la Web

La WWW (World Wide Web) es un sistema de cambio de informacion en internet. 
La web esta construida por programas especiales llamados "Web Servers". Otros 
programas llamados Web Browsers, hacen ver la informacion que contiene estos 
Web Servers en la pantalla del usuario.

La WWW es el sistema mas usado dentro de la comunidad de internet. Pero como 
todo tiene su otro lado, la WWW es uno de los sistemas mas inseguros, por 
orden de importancia es asi:

  - Un atacante puede usar bugs en el Web servers o en scripts CGI para 
    optener acceso sin autorizacion al sistema y tener el control de el 
    ordenador.

  - Informacion confidencial que se encuentre en el Web server puede ser 
    distribuida por individuos sin autorizacion.

  - La Informacion confidencial puede ser transmitida atraves del Web Server 
    y el browser puede interceptarla.


------[ Sun's Remote Procedure Call (RPC)

El bloque principal construido de un sistemas de redes de informacion es un 
mecanismo para PERFORMING las llamadas remotas. El mecanismo, normalmente se 
le llama RPC.

El sistema RPC puede hacer una categoria de sistemas bloqueados o no 
bloqueados (sistemas asicronicos).

Para que un cliente RPC se comunique con un servidor RPC, tiene que pasar 
esto:

  - El cliente RPC este corriendo.

  - El servidor RPC este corriendo en el ordenador servidor.

  - El cliente debe de conocer en host RPC es.

  - El cliente y el servidor deben aceptar comunicarse por TCP o UDP.

	El programa cliente contiene un servidor RPC que necesita una autentificacion al servidor para que el servidor determine que informacion se le es permitido el acceso y que funciones tiene. Hay diferentes formas de autentificacion para RPC:
	
	Sistema		Tecnica de Autentificacion	Comentarios
	-------		--------------------------	-----------

	AUTH_NONE	Ninguna				Sin autentificacion. Acceso anonimo.
	AUTH_UNIX	El cliente RPC envia los UID	Sin seguridad. 
 			y GID del usuario.
	AUTH_DES	Sistema basado en una llave	Razonablemente seguro.
			publica del sistema DES.
	AUTH_KERB	Autentificacion basada en	Muy seguro, pero requiere que este
			Kerbeos.			instalado un sistema de Kerbeos.


------[ Wrappers

Un wrapper es un programa que se usa para tomar control del acceso a un 
programa secundario.

Existen los wrappers de sendmail (smap/smapd). Para encontrar estos dos 
wrappers, entrar en este ftp: ftp.tis.com con usuario anonimo (anonymous).

El TIS Firewall Toolkit es todo un paquete, afortunadamente, el wrapper del 
sendmai pueden instalarse por separado del resto del paquete. El wrapper del 
sendmail, se puede usar para proteger un ordenador que este corriendo con 
sendmail, si ese ordenador no tiene activo un firewall. Para instalar el 
wrapper del sendmail una vez bajado (ftp.tis.com), tenemos que hacer esto:

  - Lee la documentacion que encontraremos dentro del paquete y compila el 
    wrapper.

  - Instala el archivo de configuracion: netperm-table localizado en: 
    /usr/local/etc/netperm-table.

  - Edita las normas (rules) de smap y smapd para especificar el UID bajo el 
    que quieres que corra smap, donde esta el sendmail, etc. Por ejemplo:

	smap, smapd:    userid 5
	smap, smapd:    directory /var/spool/smap
	smapd:          executable /usr/local/etc/smapd
	smapd:          sendmail /usr/lib/sendmail
	smapd:          baddir /var/spool/smap/bad
	smap:           timeout 3600
	
  - Crea el directorio smap mail-spool (por ejemplo /usr/spool/smap). Pon los 
    privilegios al directorio:

	# chown 5 /usr/spool/smap
	# chmod 700 usr/spool/smap

    Tambien crea el direcotorio de "bad mail" 
    (por ejemplo /usr/spool/smap/bad). Tambien por los privilegios de 
    directorio que se especifica en el fichero de configuracion:

	# chown 5 /usr/spool/smap /usr/spool/smap/bad
	# chmod 700 /usr/spool/smap /usr/spool/smap/bad

  - Haz un kill del daemond sendmail si esta corriendo.

  - Modifica el sendmail.cf. Este es un ejemplo de root, daemond, uucp y mail:

	###################
	#  Trusted users  #
	###################

	# this is equivalent to setting class "t"
	# Ft/etc/sendmail.ct
	Troot
	Tdaemon
	Tuucp
	Tmail

  - Edita el /etc/inetd.conf insertando esta linea:

	smtp    stream  tcp     nowait  root    /usr/local/etc/smap     smap

  - Luego haz esto:

	# ps aux | grep inetd
	root       129   0.0  1.8 1.52M  296K ?  S     0:00  (inetd)
	root      1954   0.0  1.3 1.60M  208K p5 S     0:00 grep inetd
	# kill -HUP 129
	
   - Testea si smap recibe e-mail, enviando un e-mail desde root. Haz esto:

	# telnet localhost smtp
	Trying 127.0.0.1... Connected to localhost.
	Escape character is "^]".
	220 122.22.22.2 SMTP/smap Ready.
	helo 122.22.22.2
	250 (122.22.22.2) pleased to meet you.
	mail From:<root@122.22.22.2>
	250 <root@122.22.22.2>... Sender Ok
	rcpt To:<root@122.22.22.2>
	250 <root@122.22.22.2> OK
	data
	354 Enter mail, end with "." on a line by itself
	Esto es una prueba.
	.
	250 Mail accepted
	quit
	221 Closing connection
	Connection closed by foreign host.
	#


    Logicamente, en donde pone esa IP sustituyela por la tuya.

  - Chequea si el e-mail ha sido enviado al directorio /var/spool/smap (O en 
    el directorio donde has especificado).

  - Instala el smapd en /usr/local/etc/smapd o otro directorio que se pueda 
    "suitear".

  - Carga el smapd y comprueba si el e-mail es rechazado.

  - Modifica el arranque del sistema para que cargue el smapd automaticamente.


------[ TCP-Wrappers

El programa tcpwrapper, escrito por Wietse Venema, es muy facil de utilizar 
y puedes logear e interceptar los servicios TCP que estan en inetd.

Para conseguir este tcpwrapper puedes bajarlo de este FTP poniendo en XXX la 
version del programa: ftp.win.tue.nl/pub/security/tcp_wrapper_XXX.tar.gz.

Este tcpwrapper, da al administrador de sistemas un gran control sobre las 
conexiones TCP que se realizan. Este programa se carga por el inetd despues de
que un host remoto se conecte a tu ordenador, con el tcpwrapper puedes hacer
esto:

  - Puedes enviar un "banner" a la conexion. Esto sirve para enviar un 
    mensaje a la personas que se ha conectado.

  - Comparar los hostnames entrantes y te dice que servicios estan activos en 
    la lista de control, si el servidor esta denegado, el tcpwrapper cierra 
    la conexion.

  - Usa el protocolo ident para determinar el nombre de usuario asociado a la 
    conexion entrante (mas informacion sobre ident en el RFC 1413).

  - Logea los resultados con syslog.

  - Opcionalmente puede correr comandos (Por ejemplo ejecuta finger para ver 
    quien esta conectado a tu ordenador).

  - Pasa el control de la conexion a un daemond de red "real".

  - Tranfiere a una sistema de "jaula" para estudiar las acciones de los 
    usuarios.

El sistema del tcpwrapper es muy simple pero potente, puedes especificar en 
un archivo de configuracion que host son bienvenidos o denegados, este 
fichero es /etc/host.allow y /etc/host.deny.

Ahora tratare la manera de como escribir nuestros propios wrappers. En la 
mayoria de los casos, necesitaras escribir tus propios wrappers, si no 
encontramos el wrapper que queremos. Ahora os pongo un wrapper ejemplo de 
sendmail para que os podais "guiar":


/* Comienzo del programa en C */

/* Cambia la siguiente linea con el path completo del fichero que quieres proteger por el wrapper */

#define COMMAND "/usr/lib/sendmail.dist"
#define VAR_NAME "LD_"

main(argc,argv,envp)
    int argc;
    char **argv;
    char **envp;
{
    register char  **cpp;
    register char  **xpp;
    register char   *cp;

    for (cpp = envp; cp = *cpp;) {
        if (strncmp(cp, VAR_NAME, strlen(VAR_NAME))==0) {
            for (xpp = cpp; xpp[0] = xpp[1]; xpp++){
            }    /* void */ ;
        }
        else {
            cpp++;
            }
        }

    execv(COMMAND, argv);
    perror(COMMAND);
    exit(1);
}
    /* Fin del programa en C */

Para usar este codigo, tienes que compilarlo, mover el sendmail original a una localizacion segura y despues instalar el wrapper en lugar del programa real. Por ejemplo, pondriamos esto (Siendo root, se presupone):

	# make wrapper
	# mv /usr/lib/sendmail /usr/lib/sendmail.dist
	# chmod 100 /usr/lib/sendmail.dist
	# mv ./wrapper /usr/lib/sendmail
	# chown root /usr/lib/sendmail
	# chmod 4711 /usr/lib/sendmail

Ahora pondre otro wrapper, que es para Logging:


/* Comienzo del programa en C */

/* Cambia la siguiente linea con el path completo del fichero que quieres proteger por el wrapper */

#define COMMAND "/usr/lib/.hidden/lpr"
#include <syslog.h>

main(argc,argv,envp)
    int argc;
    char **argv, **envp;
{
    int iloop;

    openlog("xtra-log", LOG_PID, LOG_LPR);
    syslog(LOG_INFO, "lpr invoked with %d arguments", argc);
    for (iloop = 1; i loop < argc; iloop++){
        if(strlen(argv[iloop])>1023) argv[iloop][1023]=0;
        syslog(LOG_INFO, "arg %d is `%s'", argv[iloop]);
    }
    syslog(LOG_INFO, "uid is %d", getuid());
    closelog();

    execv(COMMAND, argv);
    perror(COMMAND);
    exit(1);
}
    /* Fin del programa en C */

Para este programa, tienes que seguir los mismos ejemplos basicos que he 
dicho con el anterior ejemplo: compilar el codigo, creas el directorio, 
mueves el lpr original a un sitio seguro y por ultimo instalas el wrapper 
origial, poniendolo donde estaba el anterior fichero original. Por ejemplo, 
hariamos esto:

	# make wrapper
	# mkdir /usr/lib/.hidden
	# chmod 700 /usr/lib/.hidden
	# mv /usr/bin/lpr /usr/lib/.hidden/lpr 
	# chmod 100 /usr/lib/.hidden/lpr 
	#  mv ./wrapper /usr/bin/lpr 
	# chown root /usr/bin/lpr 
	# chmod 4711 /usr/bin/lpr


------[ Socks

Socks, es un sistema que acepta los ordenadores detras del firewall para 
acceder a los servicios de internet. Con socks puedes especificar servicios
para un ordenador especifico, deshabilitar accesos de un host individual en 
internet, etc.

Socks, originalmente esta escrito por David Koblas y Michelle Koblas. Socks 
consiste en dos partes:

  - Socks server: Es el programa que corre en el host en donde se puede 
    comunicar directamente con Internet y ordenadores internet de tu red 
    (por ejemplo una puerta firewall).

  - Socks client: Programa modificado con el que puedes contactar con el 
    servidor Sock enviando una peticios directamente a Internet.

La distribucion de socks estandard viene con el cliente de finger, ftp, 
telnet y whois. Socks incluye librerias con las que puedes crear otros 
clientes Socks. Socks esta disponible para muchas versiones de UNIX, incluida 
SunOS, Solaris, IRIX, Ultrix, HP-UX, AIX, Interactive System UNIX, OSF/1, 
NetBSD, UNIXWare y Linux. Una version llamada PC SOCKS es para Windows.

El cliente de socks trabaja sustituyendo llamadas a las funciones de socket 
de UNIX: connect(), getsocketname(), bind(), accept(), listen() y select().

Cuando el cliente de socks acepta la conexion a un servidor de internet, las 
librerias de socks interceptan la conexion aceptada y abre una conexion al 
servidor sock. Despues de que la conexion ha sido establecida, el cliente de 
socks envia esta informacion:

  - Numero de version

  - Comando de la respuesta de la conexion

  - El numero del puerto por donde el cliente se conecta

  - La IP que usa el cliente para conectar

  - El nombre de usuario de la persona

El servidor socks mira en su lista de acceso si la conexion entrante esta en 
su lista de conexion aceptadas o rechazadas. Si la conexion es aceptada, el 
servidor abre una conexion remota y envia informcion de vuelta. Si la 
conexion es rechazada, el servidor se desconecta del cliente. Esta 
configuracion la muestro graficamente aqui (Perdon por mi ASCII):

			Telnet Server  Servidor HTTP	ZONA DE INTERNET
				\    /----------------------------------
				SOCKS----------------------- PUERTA
			        /    \
			Telnet Client  HTTP Client

SOCKS puede usarse para aceptar ordenadores detras de un firewall. En este 
caso, la conexion es abierto por el servidor de socks.

Socks solo trabaja con TCP/IP, para servicios UDP (Archie), se usa el UDP 
Relayer.


------[ Notas Finales

Para poner punto y final a este documento, voy a dar una lista de archivos 
importantes en UNIX (Aunque hay muchos mas):

	Nombre		Descripcion
	------		-----------
	

	/dev/audio	Servicio de audio salida/entrada
	/dev/console	Consola del sistema
	/dev/dsk/	Discos del sistema
	/dev/fbs/	Framebuffers
	/dev/fd		Descripcion de ficheros
	/dev/ip		Interface de IP
	/dev/kbd	Teclado
	/dev/klog	Log del Kernel
	/dev/kmem	Memoria del Kernel
	/dev/kstat	Estadisticas del Kernel
	/dev/log	Sistema de Log
	/dev/mem	Memoria
	/dev/modem	Modem
	/dev/null	
	/dev/pty*	Pseudo terminales
	/dev/rdsk	Raw disk
	/dev/*sd*	Discos SCSI
	/dev/tty*	Terminales
	/etc/utmp	Lista los usuarios que han entrado al sistema
	/etc/utmpx	Un extendido de utmp
	/etc/wtmp	Graba todos los logins y los logouts
	/etc/wtmpx	Extendido de wtmp
	/usr/adm/acct	Graba los comandos ejecutados
	/usr/adm/lastog	Graba la hora del ultimo usuario
	/usr/adm/messages Graba mensajes importantes
	/usr/adm/pacct	System V (normalmente)
	/usr/adm/wtmp	Graba todas las entradas y salidas


------[ Programas importantes (No todos)
	
	Nombre		Descripcion
	------		-----------

	adb		Es un debugger, por ejemplo para editar el kernel
	cc		Compilar de C
	cd, chdir	Construye en comando shell
	chgrp		Cambia el grupo de ficheros
	chmod		Cambia los permisos de los ficheros
	chown		Cambia el propietario de los ficheros
	chsh		Cambia la shell de un usuario
	cp		Copia ficheros
	crypt		Encripta ficheros
	csh		Un interprete de C-Shell
	dbx		Otro debugger
	des		Programa de encriptado y desencriptado DES
	find		Busca ficheros
	finger		Muestra informacion de los usuarios
	ftp		Transfiere ficheros en la red
	gcore		Usa un fichero core para correr un proceso
	kill		"Mata" una aplicacion
	kinit		Kerberos
	ksh		Una Korn-shell
	last		Muestra el ultimo usuario
	lastcomm	Muestra el ultimo comando ejecutado
	limit		Cambia los procesos limite
	login		Muestra el password
	ls		Lista ficheros
	mail		Envia un e-mail
	netstat		Muestra el estado de la red
	newgrp		Cambia tu grupo
	passwd		Cambia el password
	ps		Muestra los procesos
	pwd		Muestra tu directorio de trabajo
	renice		Cambia la prioridad de un proceso
	rlogin		Te logea en otra maquina
	rsh, krsh, rksh	Restringe una shell (System V)
	rsh		Shell remota
	sh		Bourne-shell
	strings		Muestra los string de un fichero
	su		Para cambiar de usuario
	sysadmsh	La shell de administrador
	telnet		Un terminal para conectar a otra maquina
	tip		Llama a otro ordenador
	umask		Cambia tu umask
	users		Te dice los usuarios conectados


------[ El comando ps

El comando ps, nos muestra los procesos que se estan ejecutando en este 
momento. ps nos cuenta quien esta ejecutando ese programa en nuestro sistema.

Muchos administradores, usan ps paa ver que ordenadores se estan ejecutando 
lentos, los administradores mas experimentados, usan este comando para ver 
los procesos sospechosos.

El comando ps en System V, normalmente solo muestra con que terminal esta a
sociado y que programa esta ejecutando. Para listar todos los procesos que 
estan corriendo en nuestro ordenador, tendremos que usar las opciones -ef. La 
opcion -e nos lista los procesos y la opcion -f produce una lista completa. 
Por ejemplo:

dtf% /bin/ps -ef
UID   PID  PPID  C    STIME TTY      TIME COMD
root     0     0 64   Nov 16 ?        0:01 sched
root     1     0 80   Nov 16 ?        9:56 /etc/init -
root     2     0 80   Nov 16 ?        0:10 pageout
root     3     0 80   Nov 16 ?       78:20 fsflush
root   227     1 24   Nov 16 ?        0:00 /usr/lib/saf/sac -t 300
root   269     1 18   Nov 16 console  0:00 /usr/lib/saf/ttymon -g - root 97 1 80 Nov 16 ? 1:02 /usr/sbin/rpcbind

root   208     1 80   Nov 16 ?        0:01 /usr/dt/bin/dtlogin
root    99     1 21   Nov 16 ?        0:00 /usr/sbin/keyserv
root   117     1 12   Nov 16 ?        0:00 /usr/lib/nfs/statd
root   105     1 12   Nov 16 ?        0:00 /usr/sbin/kerbd
root   119     1 27   Nov 16 ?        0:00 /usr/lib/nfs/lockd
root   138     1 12   Nov 16 ?        0:00 /usr/lib/autofs/automoun root 162 1 62 Nov 16 ? 0:01 /usr/lib/lpsched

root   142     1 41   Nov 16 ?        0:00 /usr/sbin/syslogd
root   152     1 80   Nov 16 ?        0:07 /usr/sbin/cron
root   169   162  8   Nov 16 ?        0:00 lpNet
root   172     1 80   Nov 16 ?        0:02 /usr/lib/sendmail -q1h
root   199     1 80   Nov 16 ?        0:02 /usr/sbin/vold
root   180     1 80   Nov 16 ?        0:04 /usr/lib/utmpd
root   234   227 31   Nov 16 ?        0:00 /usr/lib/saf/listen tcp
simsong 14670 14563 13 12:22:12 pts/11   0:00 rlogin next
root   235   227 45   Nov 16 ?        0:00 /usr/lib/saf/ttymon
simsong 14673 14535 34 12:23:06 pts/5    0:00 rlogin next
simsong 14509     1 80 11:32:43 ?        0:05 /usr/dt/bin/dsdm
simsong 14528 14520 80 11:32:51 ?        0:18 dtwm
simsong 14535 14533 66 11:33:04 pts/5    0:01 /usr/local/bin/tcsh
simsong 14529 14520 80 11:32:56 ?        0:03 dtfile -session dta003TF
root 14467     1 11 11:32:23 ?        0:00 /usr/openwin/bin/fbconso simsong 14635 14533 80 11:48:18 pts/12   0:01 /usr/local/bin/tcsh
simsong 14728 14727 65 15:29:20 pts/9    0:01 rlogin next
root   332   114 80   Nov 16 ?        0:02 /usr/dt/bin/rpc.ttdbserv root 14086 208 80 Dec 01 ? 8:26 /usr/openwin/bin/Xsun :0 simsong 13121 13098 80 Nov 29 pts/6 0:01 /usr/local/bin/tcsh
simsong 15074 14635 20 10:48:34 pts/12   0:00 /bin/ps -ef (Muchos de los procesos son muy largos y usan dos lineas).

Como veis, tiene varias columnas, las explicare:

Columna		Significado
-------		-----------
UID		El nombre de usuario de la persona que esta ejecutando el programa.
PID		Los numeros de procesos de identificacion.
PPID		Los procesos ID
C		El procesos utilizado, una indicacion de usa de CPU.
STIME		El tiempo que el proceso ha empezado.
TTY		El control de terminal de procesos.
TIME		El total del tiempo del uso de la CPU.
COMD		El comando que se ha usado para empezar el proceso.

Para listar procesos en Berkeley UNIX, usamos esto:

        % ps -auxww

La opcion -a lista todos los procesos, la opcion -u nos muestra la 
informacion, la opcion -x nos incluye informacion de los procesos y -ww 
incluye una linea de comandos completa. Por ejemplo:

% ps -auxww
USER       PID %CPU %MEM   SZ  RSS TT STAT   TIME COMMAND
simsong   1996 62.6  0.6 1136 1000 q8 R      0:02 ps auxww
root       111  0.0  0.0   32   16 ?  I      1:10 /etc/biod 4
daemon     115  0.0  0.1  164  148 ?  S      2:06 /etc/syslog
root       103  0.0  0.1  140  116 ?  I      0:44 /etc/portmap
root       116  0.0  0.5  860  832 ?  I     12:24 /etc/mountd -i -s
root       191  0.0  0.2  384  352 ?  I      0:30 /usr/etc/bin/lpd
root        73  0.0  0.3  528  484 ?  S <    7:31 /usr/etc/ntpd -n
root         4  0.0  0.0    0    0 ?  I      0:00 tpathd
root         3  0.0  0.0    0    0 ?  R      0:00  idleproc
root         2  0.0  0.0 4096    0 ?  D      0:00  pagedaemon


------[ El comando kill

El comando kill, puedes usarlo para parar o pausar la ejecucion de un proceso.
La sintaxis del comando kill es:

	kill [-signal] process-IDs

El comando kill acepta especificar los nombres en version actuales de UNIX. 
Por ejemplo, para enviar parar el proceso #1, pondriamos esto:

	# kill -HUP 1

En versiones antiguas de UNIX, tendremos que especificar el numero:

	# kill -1 1

El superusuario (root), puede matar cualquier proceso, otros usuaros pueden 
matar solo sus procesos. Puedes usar kill en muchos procesos al tiempo que 
listas todos sus PIDS:

	# kill -HUP 1023 3421 3221

	
------[ Libros de referencia

Curry, David A. UNIX System Security: A Guide for Users and System 
Administrators. Reading, MA: Addison Wesley, 1992.

Farrow, Rik. UNIX System Security. Reading, MA: Addison Wesley, 1991

Ferbrache, David, and Gavin Shearer. Unix Installation, Security & Integrity. 
Englewood Cliffs, NJ: Prentice Hall, 1993

	
------[ Fin del documento

Bueno amigos lectores, espero que os gustara este documento, me ha llevado un 
tiempo escribirlo. Antes de finalizar, quiero decir que esto, ademas de ser 
mio, es una traduccion parcial del libro: Practical UNIX & Internet Security, 
escrito por Simson Garfinkel & Gene Spafford del que he aprendido mucho sobre 
la seguridad en general, es un libro bastante largo, y como he dicho, casi 
todo lo que he escrito, ha sido basado en este gran libro. Espero que os 
gustara y que escribirlo no fuera una perdida de tiempo.

*EOF*
